#include "literal.h"
#include <stdio.h>
#include "expresion.h"
#include "abcyp.h"

#define VAR "x"

/* FUNCION CREADA PARA DEBBUG.
PRE: Recibe un puntero a un arbol y un string para identificar la pocicion actual.
POS: Recorre el arbol y muestra el contenido de sus ramas y la pocicion que le corresponde*/
void recorrer_AB(TAB* expr,const char* nodo){
  int error;
  char* nodo2;
  char* linea;
  TLiteral literal;
  AB_ElemCte(*expr,&literal);
  if (!strcmp(nodo," "))
    nodo2=strdup("RAIZ");
  else{
  }

  AB_ElemCte(*expr,&literal);
  Literal_AString(&literal,&linea);
  printf("%s: %s\n",nodo,linea);
  Literal_Destruir(&literal);
  free(linea);

  AB_MoverCte(expr,IZQ,&error);
  if (!error){
    nodo2=(char*)malloc(sizeof(char)*(strlen(nodo)+5));
    strcpy(nodo2,nodo);
    strcat(nodo2,"-IZQ");
    recorrer_AB(expr,nodo2);
    free(nodo2);
  }
  AB_MoverCte(expr,DER,&error);

  if (!error){
    nodo2=(char*)malloc(sizeof(char)*(strlen(nodo)+5));
    strcpy(nodo2,nodo);
    strcat(nodo2,"-DER");
    recorrer_AB(expr,nodo2);
    free(nodo2);
  }
  AB_MoverCte(expr,PAD,&error);
}



int main(int argc, char* argv[]) {
  TPila pila;
  TExpresion expr,destino,destino2,destino3;
  char* string;
  int error;


  char* prueba="x^(-2)";
  printf("Formula a derivar: %s\n",prueba);

        P_Crear(&pila, sizeof(TLiteral));


        Expresion_Crear (&expr);

        Expresion_Parsear (&expr, prueba, VAR);


  error=Expresion_Simplificar(&expr,&destino);
  if(error!=1){
    if(error==-3) fprintf(stderr,"MA Error\n");
    Expresion_Destruir(&expr);
    printf("%d",error);
    return 0;
  }

recorrer_AB(&destino,"RAIZ");





        Expresion_Derivar(&destino,&destino2);

printf("Derivo\n");
        Expresion_AString (&destino2, &string);
        printf("Formula derivada: %s\n",string);
        free(string);


  error=Expresion_Simplificar(&destino2,&destino3);
  if(error!=1){
    if(error==-3) fprintf(stderr,"MA Error\n");
    printf("ERROR: %d\n",error);
    Expresion_Destruir(&expr);
    return 0;
  }
        Expresion_AString (&destino3, &string);
        printf("Formula derivada y simplificada: %s\n",string);
        free(string);




  Expresion_Destruir (&expr);
  Expresion_Destruir (&destino);
  Expresion_Destruir (&destino2);
  Expresion_Destruir (&destino3);

        return 0;
}
